\documentclass[format=sigconf]{acmart}
\usepackage[utf8]{inputenc}

\def\inputfig#1{\input #1}
\def\inputtex#1{\input #1}
\def\inputal#1{\input #1}
\def\inputcode#1{\input #1}

\inputtex{logos.tex}
\inputtex{refmacros.tex}
\inputtex{other-macros.tex}

\acmConference[ELS'20]{the 13th European Lisp Symposium}{April 27--28 2020}{%
  Zürich, Switzerland}
%\acmISBN{978-2-9557474-3-8}
\acmISBN{}
\acmDOI{10.5281/zenodo.3747548}
\startPage{1}
\setcopyright{rightsretained}
\copyrightyear{2020}

\begin{document}
\title{Omnipresent and low-overhead application debugging}

\author{Robert Strandh}
\email{robert.strandh@u-bordeaux.fr}

\affiliation{
  \institution{LaBRI, University of Bordeaux}
  \streetaddress{351 cours de la libération}
  \city{Talence}
  \country{France}}

\begin{abstract}
The state of the art in application debugging in free \commonlisp{}
implementations leaves much to be desired.  In many cases, only a
backtrace inspector is provided, allowing the application programmer
to examine the control stack when an unhandled error is signaled.
Most such implementations do not allow the programmer to set
breakpoints (unconditional or conditional), nor to step the program
after it has stopped.

Furthermore, even debugging tools such as tracing or manually calling
\texttt{break} are typically very limited in that they do not allow
the programmer to trace or break in important system functions such as
\texttt{make-instance} or \texttt{shared-initialize}, simply because
these tools impact all callers, including those of the system itself,
such as the compiler.

In this paper, we suggest a technique that solves most of these
problems.  The main idea is to have a \emph{debugger thread} debug one
or more \emph{application threads}, with all these threads running in
the same image.  Tracing and setting breakpoints have an effect only
in the debugged thread so that system code running in other threads is
not impacted.  We discuss several advantages of this technique, and in
particular how it can make debugging \emph{omnipresent}, i.e., not
requiring recompilation to get its benefits.  We describe how to
achieve this advantage while keeping the \emph{overhead} low for
threads that are not being debugged.
\end{abstract}


\begin{CCSXML}
<ccs2012>
<concept>
<concept_id>10011007.10011074.10011099.10011102.10011103</concept_id>
<concept_desc>Software and its engineering~Software testing and debugging</concept_desc>
<concept_significance>500</concept_significance>
</concept>
<concept>
<concept_id>10011007.10011006.10011041.10011048</concept_id>
<concept_desc>Software and its engineering~Runtime environments</concept_desc>
<concept_significance>500</concept_significance>
</concept>
</ccs2012>
\end{CCSXML}

\ccsdesc[500]{Software and its engineering~Software testing and debugging}
\ccsdesc[500]{Software and its engineering~Runtime environments}

\keywords{\clos{}, \commonlisp{}, Compilation, Debugging}

\maketitle


\inputtex{sec-introduction.tex}
\inputtex{sec-previous.tex}
\inputtex{sec-sicl.tex}
\inputtex{sec-our-method.tex}
\inputtex{sec-benefits.tex}
\inputtex{sec-disadvantages.tex}
\inputtex{sec-conclusions.tex}
\inputtex{sec-acknowledgments.tex}

\bibliographystyle{plainnat}
%\bibliographystyle{abbrv}
\bibliography{sicl-debugging}
\end{document}
